package day15;

public class Demo01 {
	public static void main(String[] args) {
		// 在其它类中创建非静态内部类的对象
		Some.Other o = new Some().new Other();
		o.show();

		// 其它类中创建静态内部类对象
		Some.Other02 o2 = new Some.Other02();
		o2.show();

		// 其它类中访问静态内部类中静态方法
		Some.Other02.show02();

		// 其它类中无法直接创建局部内部类对象
		// 
		OtherInterface oi = new Some().some();
		oi.show();
	}
}

// ----------------------------------------------------

interface OtherInterface {
	public void show();
}

// 相对于内部类而言: 外部类
class Some {
	private int i = 10;
	private static int j = 20;

	public OtherInterface some() {
		// System.out.println(this.i);

		int x = 50;

		// 定义在方法中的类: 局部内部类
		// 局部内部类与局部变量一样, 不能被static修饰
		// 让局部内部类实现某个接口, 外部类的方法返回接口类型的对象
		// 在其它类中通过调用该反方获得返回值(接口类型的引用, 指向的局部内部类对象)
		class Other03 implements OtherInterface {
			public void show() {
				System.out.println(i);
				System.out.println(j);
				// 局部内部类访问局部变量时, 要求变量必须是final的
				// 或effectively final: 源码声明时没有final, 编译时Java会加上final
				System.out.println(x);
			}
		}

		// 当局部变量被局部内部类访问
		// 不能对该局部变量修改, 因为它是final性质的
		// x = 40;

		// 局部内部类的对象, 只能在方法内创建
		Other03 o = new Other03();
		return o;

	}

	// 在类中定义类: 非静态内部类
	class Other {
		public void show() {
			// 在内部类中, 可以直接访问外部类成员
			System.out.println(i);
			System.out.println(j);
			// 内部类中持有外部类的实例引用, 表现形式: "外部类名.this"
			System.out.println(Some.this.i);
		}
	}

	// 静态内部类
	static class Other02 {
		public void show() {
			// 静态内部类中, 不能直接访问外部类非静态成员
			// System.out.println(i);
			// 静态内部类中, 只能直接访问外部类静态成员
			System.out.println(j);
		}

		public static void show02() {

		}
	}

}